home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 10
/
AACD 10.iso
/
AACD
/
Resources
/
Online
/
Term
/
Extras
/
Source
/
gtlayout-source.lha
/
LT_NewMenuTagList.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-09-23
|
10KB
|
361 lines
/*
** GadTools layout toolkit
**
** Copyright © 1993-1996 by Olaf `Olsen' Barthel
** Freely distributable.
**
** :ts=4
*/
#ifndef _GTLAYOUT_GLOBAL_H
#include "gtlayout_global.h"
#endif
#ifdef DO_MENUS
/****** gtlayout.library/LT_NewMenuTagList ******************************************
*
* NAME
* LT_NewMenuTagList -- Allocate and layout menu items (V11)
*
* SYNOPSIS
* Menu = LT_NewMenuTagList(Tags)
* D0 A0
*
* struct Menu *LT_NewMenuTagList(struct TagItem *);
*
* struct Menu *LT_NewMenuTags(...);
*
* FUNCTION
* Allocates Menus and MenuItems similar to LT_LayoutMenus().
*
* As of v18 this routine will validate menu mutual exclusion
* information.
*
* INPUTS
* Tags - Pointer to a list of tagitem values, as found
* in gtlayout.h
*
*
* Valid tags include:
*
* LAMN_Screen (struct Screen *) - Pointer to the Screen
* the menu is to appear upon. This tag is mandatory,
* unless the LAMN_LayoutHandle tag is used.
*
* LAMN_TextAttr (struct TextAttr *) - Pointer to the
* TextAttr to use for the menu layout. If this tag
* is omitted the Screen->Font will be used.
*
* LAMN_Error (LONG *) - Pointer to variable to receive
* an error in case of failure.
*
* LAMN_AmigaGlyph (struct Image *) - Pointer to Image to
* use as the Amiga glyph in menus. Will be ignored if
* NULL.
*
* NOTE: Ignored by intuition.library v37 and below.
*
* LAMN_CheckmarkGlyph (struct Image *) - Pointer to Image to
* use as the checkmark glyph in menus. Will be ignored
* if NULL.
*
* LAMN_LayoutHandle (LayoutHandle *) - Pointer to a valid
* LayoutHandle as created by LT_CreateHandle. This tag
* provides all the information the single tags
* LAMN_Screen..LAMN_CheckmarkGlyph would otherwise
* need to provide.
*
* LAMN_TitleText (STRPTR) - Name of new menu to create.
* You may precede the name with the keyboard shortcut
* to assign to this menu item as follows:
*
* A\0Save as...
*
* This will create a menu item using the shortcut "A"
* and the title "Save as...".
*
* LAMN_TitleID (LONG) - Locale ID corresponding to the
* name of the new menu to create.
* You may precede the name with the keyboard shortcut
* to assign to this menu item as follows:
*
* A\0Save as...
*
* This will create a menu item using the shortcut "A"
* and the title "Save as...".
*
* LAMN_ItemText (STRPTR) - Name of new menu item to create.
* You may precede the name with the keyboard shortcut
* to assign to this menu item as follows:
*
* A\0Save as...
*
* This will create a menu item using the shortcut "A"
* and the title "Save as...".
*
* LAMN_ItemID (LONG) - Locale ID corresponding to the
* name of the new menu item to create.
* You may precede the name with the keyboard shortcut
* to assign to this menu item as follows:
*
* A\0Save as...
*
* This will create a menu item using the shortcut "A"
* and the title "Save as...".
*
* LAMN_SubText (STRPTR) - Name of new submenu item to create.
* You may precede the name with the keyboard shortcut
* to assign to this menu item as follows:
*
* A\0Save as...
*
* This will create a menu item using the shortcut "A"
* and the title "Save as...".
*
* LAMN_SubID (LONG) - Locale ID corresponding to the
* name of the new submenu item to create.
* You may precede the name with the keyboard shortcut
* to assign to this menu item as follows:
*
* A\0Save as...
*
* This will create a menu item using the shortcut "A"
* and the title "Save as...".
*
* LAMN_KeyText (STRPTR) - Pointer to the string whose first
* character will be used as the keyboard shortcut for
* this menu/submenu item.
*
* LAMN_KeyID (LONG) - Locale ID corresponding to the string whose
* first character will be used as the keyboard shortcut for
* this menu/submenu item.
*
* LAMN_CommandText (STRPTR) - Pointer to the string which
* will be used as the keyboard shortcut for this
* menu/submenu item.
*
* LAMN_CommandID (LONG) - Locale ID corresponding to the string
* which will be used as the keyboard shortcut for
* this menu/submenu item.
*
* LAMN_MutualExclude (ULONG) - Mutual exclusion information for
* this menu/submenu item.
*
* LAMN_UserData (APTR) - User data information for this
* menu/menu item/submenu item.
*
* LAMN_Disabled (BOOL) - Controls whether this
* menu/menu item/submenu item should be disabled.
*
* LAMN_CheckIt (BOOL) - Controls whether this menu/submenu item
* should be prepared to hold a checkmark.
*
* NOTE: This does not set the checkmark, use LAMN_Checked
* for this purpose.
*
* LAMN_Checked (BOOL) - Controls whether this menu/submenu item
* should be marked with a checkmark. This tag implies
* "LAMN_Checked,TRUE".
*
* LAMN_Toggle (BOOL) - Controls whether this menu/submenu item
* should be prepared to hold a checkmark the user is to
* toggle on demand. This tag implies "LAMN_Checked,TRUE".
*
* NOTE: this does not set the checkmark, use LAMN_Checked
* for this purpose.
*
* LAMN_Code (UWORD) - Raw key code to associate with this
* menu/submenu item. To find out if a rawkey event
* corresponds to this menu item use LT_FindMenuCommand.
*
* LAMN_Qualifier (ULONG) - Key qualifier to associate
* with this menu/submenu item.
*
* NOTE: the comparison does not distinguish between
* the left and right shift/caps/alt qualifier keys.
*
* LAMN_ID (ULONG) - Unique ID to associate with this
* menu/menu item/submenu item. You can use this
* later to look up data using LT_GetMenuItem, etc.
*
* LAMN_ExtraSpace (UWORD) - Number of pixels to put between
* neighbouring menu titles. (V18)
* Default: 0 pixels.
*
* RESULT
* Menu - Pointer to Menu structure, ready to pass to
* SetMenuStrip(), NULL on failure.
*
* EXAMPLE
* The following tagitem list:
*
* LAMN_TitleText, "Project"
* LAMN_ItemText, "New",
* LAMN_KeyText, "N",
* LAMN_ItemText, "Open...",
* LAMN_KeyText, "O",
* LAMN_ItemText, NM_BARLABEL,
* LAMN_ItemText, "Save",
* LAMN_KeyText, "S",
* LAMN_ItemText, "A\0Save As...",
* LAMN_ItemText, NM_BARLABEL,
* LAMN_ItemText, "Print...",
* LAMN_KeyText, "P",
* LAMN_ItemText, NM_BARLABEL,
* LAMN_ItemText, "Help...",
* LAMN_CommandText, "[Help]",
* LAMN_ItemText, NM_BARLABEL,
* LAMN_ItemText, "Quit...",
* LAMN_KeyText, "Q",
* TAG_DONE
*
* Will create the following menu:
*
* +-------+
* |Project|
* +-------+------+
* |New aN|
* |Open... aO|
* |~~~~~~~~~~~~~~|
* |Save aS|
* |Save As... aA|
* |~~~~~~~~~~~~~~|
* |Print... aP|
* |~~~~~~~~~~~~~~|
* |Help... [Help]|
* |~~~~~~~~~~~~~~|
* |Quit... aQ|
* +--------------+
*
* NOTES
* You may freely add, remove, spindle & mutilate the contents of the
* menu strip created, just don't trash or disconnect the base menu
* entry this routine creates as all menu memory tracking data is
* connected to it.
*
* SEE ALSO
* gtlayout.library/LT_DisposeMenu
* gtlayout.library/LT_FindCommandItem
* gtlayout.library/LT_GetMenuItem
* gtlayout.library/LT_LayoutMenuA
* gtlayout.library/LT_MenuControlTagList
* gtlayout.library/LT_NewMenuTemplate
* intuition.library/SetMenuStrip
*
******************************************************************************
*
*/
struct Menu * LIBENT
LT_NewMenuTagList(REG(a0) struct TagItem *TagList)
{
RootMenu *Root;
struct Image *AmigaGlyph = NULL,
*CheckGlyph = NULL;
LONG *ErrorPtr = NULL,
Error;
struct Screen *Screen = NULL;
struct TextAttr *TextAttr = NULL;
struct TagItem *List,
*Entry;
LayoutHandle *Handle = NULL;
struct Hook *LocaleHook = NULL;
LONG ExtraSpace = 0;
List = TagList;
while(Entry = NextTagItem(&List))
{
switch(Entry->ti_Tag)
{
case LAMN_AmigaGlyph:
AmigaGlyph = (struct Image *)Entry->ti_Data;
break;
case LAMN_CheckmarkGlyph:
CheckGlyph = (struct Image *)Entry->ti_Data;
break;
case LAMN_Error:
ErrorPtr = (LONG *)Entry->ti_Data;
break;
case LAMN_Screen:
Screen = (struct Screen *)Entry->ti_Data;
break;
case LAMN_TextAttr:
TextAttr = (struct TextAttr *)Entry->ti_Data;
break;
case LAMN_Handle:
Handle = (LayoutHandle *)Entry->ti_Data;
Screen = Handle->Screen;
TextAttr = Handle->InitialTextAttr;
AmigaGlyph = Handle->AmigaGlyph;
CheckGlyph = Handle->CheckGlyph;
break;
case LAMN_ExtraSpace:
ExtraSpace = Entry->ti_Data;
break;
case LH_LocaleHook:
LocaleHook = (struct Hook *)Entry->ti_Data;
break;
}
}
if(Handle)
LocaleHook = Handle->LocaleHook;
if(ErrorPtr)
*ErrorPtr = 0;
if(Root = LTP_NewMenu(Screen,TextAttr,AmigaGlyph,CheckGlyph,&Error))
{
Root->Handle = Handle;
Root->LocaleHook = LocaleHook;
// Create the menu
if(LTP_CreateMenuTagList(Root,&Error,TagList))
{
// Do the layout
if(LTP_LayoutMenu(Root,0,ExtraSpace))
return(&Root->Menu);
else
Error = ERROR_DISK_FULL;
}
LT_DisposeMenu(&Root->Menu);
}
if(ErrorPtr)
*ErrorPtr = Error;
return(NULL);
}
/*****************************************************************************/
struct Menu *
LT_NewMenuTags(Tag FirstTag,...)
{
return(LT_NewMenuTagList((struct TagItem *)&FirstTag));
}
#endif /* DO_MENUS */